<?php
/**
 * UserHelper
 *
 * Différentes fonctions permettant la gestion
 * des utilisateurs
 *
 * @author bozec
 *
 * API:
 *
 * - <code>is_current_user</code>: teste si un objet user correspond à l'utilisateur
 *   connecté
 * - <code>is_deletable_user</code>: Vérifié si un objet user est effacable.
 * - <code>is_allowed_to_edit</code>: Vérifie si l'on peuit éditer un utilisateur
 * - <code>is_admin</code>: Vérifie si'l'uilisateur connecté est administrateur
 * - <code>format_login</code>: Formatte le login d'un utilisateur par un lien ou du texte brut
 * - <code>generate_confirm_url</code>: génère une url encodé en base 64 permettant la confirmation de
 *   réinitiatlisation de mot de passe.
 * - <code>guard_link_to_edit</code>: génère un lien permettant d'editer son compte
 *   uniquement si l'utilisateur est administrator ou si s'agit de son propre compte
 */

/**
 * Compare l'objet user passé en paramètre avec l'utilisateur courrant dans la sessions.
 * renvoie true si identique.
 *
 * @param object user $user
 * @return boolean true si identique
 * @author bozec
 */
function is_current_user($user)
{
  return ($user->getLogin() === sfContext::getInstance()->getUser()->getAttribute('user_login')) ? true : false;
}

/**
 * Vérifié si un objet user est effacable.
 * Pour l'être, ce ne doit ni être admin, ni être l'utilisateur connecté
 *
 * @param object user $user
 * @return boolean true si effacable
 * @author bozec
 */
function is_deletable_user($user)
{
  if (!is_current_user($user) and !$user->getIsProtected())
  {
    return true;
  }
  else
  {
    return false;
  }
}

/**
 * Vérifie si l'utilisateur connecté a les droits d'édition
 * sur un utilisateur.
 *
 * @param object user $user
 * @return boolean true si editable
 * @author bozec
 */
function is_allowed_to_edit($user)
{
  if (is_current_user($user)
  or sfContext::getInstance()->getUser()->getAttribute('user_login') == 'admin')
  {
    return true;
  }
  else
  {
    return false;
  }
}

/**
 * Vérifie si'l'uilisateur connecté est administrateur
 *
 * @param object user $user
 * @return boolean true si admin
 * @author bozec
 */
function is_admin()
{
  $user = GuardUserPeer::retrieveByLogin(sfContext::getInstance()->getUser()->getAttribute('user_login'));
  if (!$user)
  {
    return false;
  }
  $c = new Criteria();
  $c->addJoin(GuardUserPermissionPeer::PERMISSION_ID, GuardPermissionPeer::ID);
  $c->add(GuardUserPermissionPeer::USER_ID, $user->getId());
  $c->add(GuardPermissionPeer::NAME, sfConfig::get('super_name'));
  $admin = GuardUserPermissionPeer::doSelect($c);

  return ($user->getIsProtected() || $admin) ? true : false;

}

/**
 * Formatte le login d'un utilisateur par un lien ou du texte brut
 * suivant si l'utilsateur est editable ou non
 *
 * @param object user $user
 * @return string chaine du login formatté
 * @author bozec
 */
function format_login($user)
{
  if (is_allowed_to_edit($user))
  {
    return link_to($user->getLogin(), 'sf2s3iGuard/edit?id='.$user->getId());
  }
  else
  {
    return $user->getLogin();
  }
}

/**
 * génère une url permettant la confirmation de réinitiatlisation de mot de passe.
 * L'url est de la forme:
 * <code>{url absolu du site}/user/initPassword?login={user_login}&token={user_token}</code>
 *
 * @param object user utilisateur courant
 * @return string url de confirmation
 * @author bozec
 */
function generate_confirm_url($user)
{
  $param = base64_encode($user->getLogin().'|'.$user->getToken());

  $url = 'sf2s3iGuard/initPassword?q='.$param;
  return url_for($url, true);

}

/**
 * génère un lien permettant d'editer son compte
 * uniquement si l'utilisateur est administrator ou si s'agit de son propre compte
 *
 * @param object user current_user
 * @return string	lien ou seulement le nom du compte
 * @author bozec
 */
function guard_link_to_edit($current_user)
{
  $user = sfContext::getInstance()->getUser();
  if ($user->hasCredential(sfConfig::get('super_name'))
  or $user->getAttribute('user_login') == $current_user->getLogin())
  {
    return link_to($current_user->getLogin(), 'sf2s3iGuard/guardEdit?id='.$current_user->getId());
  }
  else
  {
    return $current_user->getLogin();
  }
}